# [Как стать Git-мастером: 7 советов по повышению производительности](https://nuancesprog.ru/p/5142/)

## Автозаполнение команд Git в терминале
Большинство команд терминала для Git начинаются с ключевого слова `git`, за которым следует пробел и второе ключевое слово. Из-за наличия пробела между этими командами терминал обрабатывает их как разные слова, в результате чего автозаполнение через клавишу Tab не работает по умолчанию.

Git предоставляет сценарий автозаполнения, который нужно скачать для использования этой функции. Запустите следующую команду для скачивания сценария в домашнюю директорию:

    cd ~
    curl https://github.com/git/git/blob/master/contrib/completion/git-completion.bash
Затем добавьте следующие строки в файл `.bash_profile`, расположенный в домашней директории:

    if [ -f ~/.git-completion.bash ]; then
      . ~/.git-completion.bash
    fi
Этот фрагмент выполняет поиск сценария автозаполнения в домашней директории и, при наличии запускает его при каждом входе в bash.

## Локальное удаление ветки в удаленном репозитории
С помощью команды `push` можно быстро удалить ветку в удаленном репозитории из локальной системы. Предположим, что у вас уже есть доступ к удаленному репозиторию.

Вам нужно будет запустить следующую команду для удаления ветки `branch_name` из удаленного репозитория `remote_name`. Действовать надо крайне осторожно, поскольку этот шаг невозможно отменить.

    git push remote_name :branch_name
Запуск команды помещает пустую ветку в `branch_name`, полностью удаляя `branch_name` из `remote_name`.

## Force Push без рисков
При перемещении коммитов в локальной ветке или любом другом способе изменения истории push на удаленный доступ будет отклонен. В качестве обходного пути просто используйте опцию `--force`, которая переписывает историю ветки удаленного репозитория. Процесс опасный, поскольку он перезаписывает любые коммиты, которые могли быть перенесены кем-либо на удаленный репозиторий с момента последнего использования pull.

Более безопасный вариант выполнения `force push` — это использование опции `--force-with-lease`. Она работает тем же образом, если никто не отправлял обновления с момента последнего получения данных с удаленного репозитория. Однако во всех остальных случаях `push` будет отклонен. Отклоненный `push` укажет на необходимость обновления локальной ветки с обновленным удаленным репозиторием до следующей попытки отправки изменений.

## Отмена изменений в Git
Несмотря на определенную пользу Git в большинстве случаев, иногда необходимо внести изменения в некоторые операции. В этом разделе мы обсудим отмену трех типов изменений — отслеживание файла, внесение изменений и создание коммита.

Чтобы отменить процесс отслеживания файла с Git, запустите следующую команду:

    git rm --cached added_file
Для отмены внесения изменений в файл с момента последнего коммита выполните следующее:

    git reset HEAD staged_file
Эта команда восстанавливает статус файла `staged_file` к `HEAD`, который указывает на последний коммит. Однако, если вы также выполнили коммит изменений, есть еще один способ вернуться к этапу до коммита.

    git reset --soft HEAD~N
Эта команда отменяет статус репозитория до N коммитов перед HEAD и не приводит к изменениям в файлах.

## Сохранение незафиксированных изменений с помощью stash
Представьте, что вы работаете с новой функцией, а начальник спрашивает о ходе выполнения предыдущего задания. Текущая функция еще не завершена, поэтому создание коммита не имеет логического смысла. Что же нужно сделать?

На помощь приходят Git stash. Следующая команда сохраняет все незафиксированные изменения и возвращается к состоянию репозитория при последнем коммите.

    git stash
Чтобы возобновить работу над этой функцией, используйте следующую команду для проверки всех stashes:

    git stash list
Эта команда показывает список всех сохраненных stash с отметками времени. Применить N-й stash из списка stash можно с помощью следующей команды:

    git stash apply stash@{N}
## Выборочная фиксация изменений из файла
Можно ли сделать так, чтобы несколько изменений в одном файле появились в разных коммитах? Традиционная команда git add помещает все изменения в файл, поэтому добавьте опцию `-p`, чтобы запустить Мастера, с помощью которого можно выборочно вносить изменения в файл.

    git add -p
## Обработка больших файлов с помощью Git LFS
Git хорошо справляется с текстовыми файлами, однако не способен эффективно обрабатывать двоичные файлы. Документы Excel, проекты Photoshop и другие исполняемые файлы — примеры таких двоичных файлов.

На помощь приходит **Git LFS**! Это open source расширение для Git, которое управляет большими двоичными файлами, помещая текстовые указатели в Git и сохраняя содержимое файла на удаленном сервере. В результате повышается эффективность процесса управления репозиторием, в то время как удаленный сервер обрабатывает большие двоичные файлы при внесении изменений.

После загрузки и установки в локальной системе инициализируйте Git LFS для каждого репозитория с помощью следующей команды:

    git lfs install
Чтобы отследить один тип расширения файла (например, PSD), выполните следующую команду:

    git lfs track "*.psd"
Более того, можно отслеживать и другие файлы, редактируя файл `.gitattributes`.

## Бонусный совет: отладка с помощью Git
Знаете ли вы, что Git — очень эффективный инструмент для устранения проблем в кодовой базе? `Git Blame` помогает тщательно проанализировать историю файла, а процесс Bisect инициирует бинарный поиск по коммитам.